/**
 * 数据字典常量管理
 * 统一管理项目中所有数据字典类型，提供缓存机制和统一的获取方法
 * @author 贝尔云开发团队
 * @version 1.0.0
 */

import store from '@/store'

// 数据字典类型常量定义
export const DICTIONARY_TYPES = {
  // 基础数据
  BRAND: 'Brand', // 品牌
  SEX: 'sex', // 性别
  NATION: 'Nation', // 民族
  EDUCATION: 'Education', // 学历
  CERTIFICATE_TYPE: 'certificateType', // 证件类型

  // 校区相关
  CAMPUS_TYPE: 'CampusType', // 校区类型
  CAMPUS_LEVEL: 'CampusLevel', // 校区等级
  CAMPUS_STATUS: 'CampusStatus', // 校区状态 

  // 客户相关
  CUSTOMER_CATEGORY: 'CustomerCategory', // 客户类别
  CUSTOMER_AGE: 'CustomerAge', // 客户年龄段
  CONSULT_CHANNELS: 'ConsultChannels', // 咨询渠道
  FOCUS_ATTENTION: 'FocusAttention', // 关注度
  TRACK_TYPE: 'TrackType', // 跟踪类型

  // 培训相关
  TRAIN_TYPE: 'TrainType', // 培训类型
  TRAIN_CERTIFICATE_TYPE: 'TrainCertificateType', // 培训证书类型

  // 支付相关
  PAY_STATUS: 'PayStatus', // 支付状态
  PAYMENTS_TYPE: 'PaymentsType', // 支付方式
  ORDER_STATUS: 'OrderStatus', // 订单状态

  // 开业辅导相关
  GUIDANCE_TYPE: 'guidanceType', // 辅导类型
  GUIDANCE_STATUS: 'guidanceStatus', // 辅导状态
  OPENING_TYPE: 'openingType', // 开业类型
  // 新增：托管服务
  CARE_SERVICE: 'CareService', // 托管服务
  // 问答相关
  FQA_CATEGORY: 'FqaCategory', // 问答分类
  FQA_SOURCE: 'FqaSourse', // 问答来源
  FQA_STATUS: 'FqaStatus', // 问答状态

  // 连接相关
  CONNECT_TYPE: 'ConnectType', // 连接类型

  // 商品相关
  GOODS_TYPE: 'GoodsType', // 商品类型

  // 签约相关
  SIGN_TYPE: 'SignType', // 签约类型
  SIGN_STATUS: 'SignStatus', // 签约状态

  // 工作流相关
  WORKFLOW_CATEGORY: 'WorkFlowCategory', // 工作流分类
  WF_SETTLEMENT_METHOD: 'WFSettlementMethod', // 工作流结算方式

  // 组织相关
  ENTERPRISE_NATURE: 'EnterpriseNature', // 企业性质
  INDUSTRY_TYPE: 'IndustryType', // 行业类型
  POSITION_TYPE: 'PositionType', // 职位类型
  COMPANY: 'MANAGEMENT_AREA', // 公司/管理区域

  // 系统相关
  REPORT_SORT: 'ReportSort', // 报表分类
  PRINT_DEV: 'printdev', // 打印设备
  DB_TYPE: 'dbType', // 数据库类型
  PORTAL_DESIGNER: 'portalDesigner', // 门户设计器
  // 托管服务相关
  CARE_SERVICE: 'CareService' // 托管服务
}

// 数据字典缓存
const dictionaryCache = new Map()

// 缓存过期时间（毫秒）- 30分钟
const CACHE_EXPIRE_TIME = 30 * 60 * 1000

/**
 * 缓存项结构
 * @typedef {Object} CacheItem
 * @property {Array} data - 字典数据
 * @property {number} timestamp - 缓存时间戳
 */

/**
 * 检查缓存是否过期
 * @param {CacheItem} cacheItem - 缓存项
 * @returns {boolean} 是否过期
 */
function isCacheExpired(cacheItem) {
  return Date.now() - cacheItem.timestamp > CACHE_EXPIRE_TIME
}

/**
 * 统一获取数据字典的方法
 * @param {string} sort - 字典类型
 * @param {boolean} forceRefresh - 是否强制刷新缓存
 * @returns {Promise<Array>} 字典数据数组
 */
export async function getDictionaryData(sort, forceRefresh = false) {
  try {
    // 检查缓存
    const cacheKey = sort
    const cachedItem = dictionaryCache.get(cacheKey)

    if (!forceRefresh && cachedItem && !isCacheExpired(cachedItem)) {
      return cachedItem.data
    }

    // 从store获取数据
    const data = await store.dispatch('base/getDictionaryData', { sort })

    // 更新缓存
    dictionaryCache.set(cacheKey, {
      data,
      timestamp: Date.now()
    })

    return data
  } catch (error) {
    console.error(`获取数据字典失败 [${sort}]:`, error)
    throw error
  }
}

/**
 * 获取启用状态的字典数据
 * @param {string} sort - 字典类型
 * @param {boolean} forceRefresh - 是否强制刷新缓存
 * @returns {Promise<Array>} 启用状态的字典数据数组
 */
export async function getEnabledDictionaryData(sort, forceRefresh = false) {
  try {
    const data = await getDictionaryData(sort, forceRefresh)
    return data.filter(item => item.enabledMark === 1)
  } catch (error) {
    console.error(`获取启用状态数据字典失败 [${sort}]:`, error)
    throw error
  }
}

/**
 * 根据字典值获取字典项
 * @param {string} sort - 字典类型
 * @param {string|number} value - 字典值
 * @param {boolean} forceRefresh - 是否强制刷新缓存
 * @returns {Promise<Object|null>} 字典项对象或null
 */
export async function getDictionaryItem(sort, value, forceRefresh = false) {
  try {
    const data = await getDictionaryData(sort, forceRefresh)
    return data.find(item => item.enCode === value || item.fullName === value) || null
  } catch (error) {
    console.error(`获取字典项失败 [${sort}][${value}]:`, error)
    return null
  }
}

/**
 * 根据字典值获取字典标签
 * @param {string} sort - 字典类型
 * @param {string|number} value - 字典值
 * @param {boolean} forceRefresh - 是否强制刷新缓存
 * @returns {Promise<string>} 字典标签
 */
export async function getDictionaryLabel(sort, value, forceRefresh = false) {
  try {
    const item = await getDictionaryItem(sort, value, forceRefresh)
    return item ? item.fullName : value
  } catch (error) {
    console.error(`获取字典标签失败 [${sort}][${value}]:`, error)
    return value
  }
}

/**
 * 批量获取多个字典类型的数据
 * @param {Array<string>} sorts - 字典类型数组
 * @param {boolean} forceRefresh - 是否强制刷新缓存
 * @returns {Promise<Object>} 以字典类型为key的数据对象
 */
export async function getBatchDictionaryData(sorts, forceRefresh = false) {
  try {
    const promises = sorts.map(sort => getDictionaryData(sort, forceRefresh).then(data => ({ sort, data })))

    const results = await Promise.all(promises)

    return results.reduce((acc, { sort, data }) => {
      acc[sort] = data
      return acc
    }, {})
  } catch (error) {
    console.error('批量获取数据字典失败:', error)
    throw error
  }
}

/**
 * 清除指定字典类型的缓存
 * @param {string} sort - 字典类型，不传则清除所有缓存
 */
export function clearDictionaryCache(sort) {
  if (sort) {
    dictionaryCache.delete(sort)
  } else {
    dictionaryCache.clear()
  }
}

/**
 * 预加载常用字典数据
 * @param {Array<string>} sorts - 需要预加载的字典类型数组
 */
export async function preloadDictionaryData(sorts = []) {
  const commonSorts = sorts.length > 0 ? sorts : [DICTIONARY_TYPES.BRAND, DICTIONARY_TYPES.SEX, DICTIONARY_TYPES.CAMPUS_TYPE, DICTIONARY_TYPES.CAMPUS_STATUS, DICTIONARY_TYPES.PAY_STATUS, DICTIONARY_TYPES.CONSULT_CHANNELS]

  try {
    await getBatchDictionaryData(commonSorts)
    console.log('数据字典预加载完成')
  } catch (error) {
    console.error('数据字典预加载失败:', error)
  }
}

/**
 * Vue mixin，为组件提供数据字典相关方法
 */
export const dictionaryMixin = {
  methods: {
    /**
     * 获取数据字典
     * @param {string} sort - 字典类型
     * @param {boolean} forceRefresh - 是否强制刷新
     * @returns {Promise<Array>} 字典数据
     */
    async $getDictionaryData(sort, forceRefresh = false) {
      return await getDictionaryData(sort, forceRefresh)
    },

    /**
     * 获取启用状态的字典数据
     * @param {string} sort - 字典类型
     * @param {boolean} forceRefresh - 是否强制刷新
     * @returns {Promise<Array>} 启用状态的字典数据
     */
    async $getEnabledDictionaryData(sort, forceRefresh = false) {
      return await getEnabledDictionaryData(sort, forceRefresh)
    },

    /**
     * 获取字典标签
     * @param {string} sort - 字典类型
     * @param {string|number} value - 字典值
     * @param {boolean} forceRefresh - 是否强制刷新
     * @returns {Promise<string>} 字典标签
     */
    async $getDictionaryLabel(sort, value, forceRefresh = false) {
      return await getDictionaryLabel(sort, value, forceRefresh)
    }
  }
}

// 默认导出
export default {
  DICTIONARY_TYPES,
  getDictionaryData,
  getEnabledDictionaryData,
  getDictionaryItem,
  getDictionaryLabel,
  getBatchDictionaryData,
  clearDictionaryCache,
  preloadDictionaryData,
  dictionaryMixin
}
